"""
Frappe GS 命令行工具

此模块提供了创建新站点的命令行工具，在创建站点时自动应用GreatSQL相关的补丁。
主要命令：
- new-site-gs: 创建新的Frappe站点，并自动应用GreatSQL补丁
"""

# imports - third party imports
import click

# imports - module imports
import frappe
from frappe.commands import get_site, pass_context
from frappe.exceptions import SiteNotSpecifiedError
from frappe.utils import CallbackManager
from frappe_gs import init as gs_init


@click.command("new-site")
@click.argument("site")
@click.option("--db-name", help="数据库名称")
@click.option("--db-password", help="数据库密码")
@click.option(
    "--db-type",
    default="mariadb",
    type=click.Choice(["mariadb", "postgres"]),
    help='可选 "postgres" 或 "mariadb"，默认为 "mariadb"',
)
@click.option("--db-host", help="数据库主机地址")
@click.option("--db-port", type=int, help="数据库端口号")
@click.option(
    "--db-root-username",
    "--mariadb-root-username",
    help='数据库root用户名，默认为 "root"',
)
@click.option("--db-root-password", "--mariadb-root-password", help="数据库root密码")
@click.option(
    "--no-mariadb-socket",
    is_flag=True,
    default=False,
    help="将MariaDB主机设置为%并使用TCP/IP套接字，而不是UNIX套接字",
)
@click.option("--admin-password", help="新站点的管理员密码", default=None)
@click.option("--verbose", is_flag=True, default=False, help="显示详细信息")
@click.option("--force", help="如果站点/数据库已存在，强制恢复", is_flag=True, default=False)
@click.option("--source-sql", "--source_sql", help="使用SQL文件初始化数据库")
@click.option("--install-app", multiple=True, help="安装完成后安装的应用")
@click.option("--set-default", is_flag=True, default=False, help="将新站点设置为默认站点")
def new_site_gs(
    site,
    db_root_username=None,
    db_root_password=None,
    admin_password=None,
    verbose=False,
    source_sql=None,
    force=None,
    no_mariadb_socket=False,
    install_app=None,
    db_name=None,
    db_password=None,
    db_type=None,
    db_host=None,
    db_port=None,
    set_default=False,
):
    """创建新的Frappe站点
    
    此命令在创建新站点时会自动应用GreatSQL相关的补丁，确保站点能够正常使用GreatSQL数据库。
    
    参数:
        site: 站点名称
        db_root_username: 数据库root用户名
        db_root_password: 数据库root密码
        admin_password: 站点管理员密码
        verbose: 是否显示详细信息
        source_sql: SQL文件路径，用于初始化数据库
        force: 是否强制创建
        no_mariadb_socket: 是否使用TCP/IP套接字
        install_app: 要安装的应用列表
        db_name: 数据库名称
        db_password: 数据库密码
        db_type: 数据库类型
        db_host: 数据库主机
        db_port: 数据库端口
        set_default: 是否设置为默认站点
    """
    
    # 应用猴子补丁
    gs_init()
    
    from frappe.installer import _new_site

    # 初始化站点
    frappe.init(site=site, new_site=True)

    # 确保 frappe_gs 在安装列表中
    if 'frappe_gs' not in install_app:
        install_app = list(install_app) + ['frappe_gs']

    # 创建新站点
    _new_site(
        db_name,
        site,
        db_root_username=db_root_username,
        db_root_password=db_root_password,
        admin_password=admin_password,
        verbose=verbose,
        install_apps=install_app,
        source_sql=source_sql,
        force=force,
        no_mariadb_socket=no_mariadb_socket,
        db_password=db_password,
        db_type=db_type,
        db_host=db_host,
        db_port=db_port,
    )

    # 如果需要，设置为默认站点
    if set_default:
        use(site)

# 导出命令
commands = [
    new_site_gs
]
